// models/smsLog.js
const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
  const SmsLog = sequelize.define('SmsLog', {
    // 主键ID
    log_id: {
      type: DataTypes.INTEGER.UNSIGNED,
      primaryKey: true,
      autoIncrement: true,
      comment: '短信记录ID'
    },
    
    // 手机号码
    phone: {
      type: DataTypes.CHAR(11),
      allowNull: false,
      comment: '接收短信的手机号码'
    },
    
    // 短信类型
    sms_type: {
      type: DataTypes.ENUM('LOGIN', 'REGISTER', 'RESET_PASSWORD', 'OTHER'),
      allowNull: false,
      comment: '短信发送类型'
    },
    
    // 验证码
    verification_code: {
      type: DataTypes.STRING(10),
      allowNull: true,
      comment: '发送的验证码'
    },
    
    // 阿里云返回的完整JSON
    ali_response: {
      type: DataTypes.TEXT('long'),
      allowNull: true,
      comment: '阿里云接口完整返回JSON'
    },
    
    // 发送状态
    send_status: {
      type: DataTypes.ENUM('SUCCESS', 'FAILED', 'PENDING'),
      allowNull: false,
      defaultValue: 'PENDING',
      comment: '短信发送状态'
    },
    
    // 错误信息
    error_message: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: '发送失败时的错误信息'
    },
    
    // 发送IP
    send_ip: {
      type: DataTypes.STRING(45),
      allowNull: true,
      comment: '发送请求的IP地址'
    },
    
    // 发送时间
    send_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      comment: '短信发送时间'
    },
    
    // 过期时间
    expire_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: '验证码过期时间'
    },
    
    // 验证码使用状态
    is_used: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
      defaultValue: false,
      comment: '验证码是否已被使用'
    }
  }, {
    // 模型配置
    tableName: 'sms_log',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    paranoid: true,         // 启用软删除
    deletedAt: 'deleted_at',// 软删除字段
    charset: 'utf8mb4',
    collate: 'utf8mb4_general_ci',
    engine: 'InnoDB',
    rowFormat: 'DYNAMIC',
    comment: '短信发送记录表',
    
    // 索引
    indexes: [
      {
        name: 'idx_phone_type',
        fields: ['phone', 'sms_type'],
        using: 'BTREE'
      },
      {
        name: 'idx_send_status',
        fields: ['send_status'],
        using: 'BTREE'
      }
    ],
    
    // 钩子
    hooks: {
      beforeCreate: (smsLog) => {
        // 设置验证码过期时间为发送时间后15分钟
        if (smsLog.verification_code) {
          smsLog.expire_at = new Date(Date.now() + 15 * 60 * 1000);
        }
      }
    },
    
    underscored: true
  });

  return SmsLog;
};